#ifndef __SOFTWARE_I2C_H__
#define __SOFTWARE_I2C_H__
#include <stdint.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdbool.h>
#include "py32f0xx_hal.h"


#define HARDWARE_DEV1    1
#define HARDWARE_DEV2    0

#define APDS9960_ENABLE  0
#define AP3216C_ENABLE   1


// ���� I2C ��������
#define I2C_BUS_COUNT 4

#if 1
// I2C ���ƽṹ��
typedef struct {
    uint8_t SDA_pin;   // SDA ����
    uint8_t SCL_pin;   // SCL ����
    void (*Set_SDA)(uint8_t pin, bool level);  // ���� SDA ����
    void (*Set_SCL)(uint8_t pin, bool level);  // ���� SCL ����
    bool (*Read_SDA)(uint8_t pin);  // ��ȡ SDA ����

     bool (*Config_SDA_IN_Or_OUT)(uint8_t pin,bool in_or_out);  // ��ȡ SDA ����
    void (*Delay)(void);  // ��ʱ����
} I2C_Config;
#else





// I2C ���ýṹ��
typedef struct {
    uint8_t SDA_pin;
    uint8_t SCL_pin;
    GPIO_TypeDef *SDA_port;
    GPIO_TypeDef *SCL_port;
    void (*Set_SDA)(bool level);
    void (*Set_SCL)(bool level);
    bool (*Read_SDA)(void);
    void (*Delay)(void);
} I2C_Config;

#endif
// ��ʼ�� I2C ����
void I2C_Init(void);

// ���� I2C ���߲���
void I2C_Start(uint8_t bus_id);

// ֹͣ I2C ���߲���
void I2C_Stop(uint8_t bus_id);

// �����ֽ�
void I2C_SendByte(uint8_t bus_id, uint8_t data);

// �����ֽ�
uint8_t I2C_ReceiveByte(uint8_t bus_id);

// ���� ACK
void I2C_SendACK(uint8_t bus_id, bool ack);

// ��ȡ ACK
bool I2C_ReadACK(uint8_t bus_id);



bool I2C_Write(uint8_t bus_id, uint8_t device_addr, uint8_t reg_addr, uint8_t *data, uint8_t length);
bool I2C_Read(uint8_t bus_id, uint8_t device_addr, uint8_t reg_addr, uint8_t *data, uint8_t length);

#endif